/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
****************************************************************/
package org.apache.cayenne.tools;
import org.apache.cayenne.test.file.FileUtil;
import org.apache.cayenne.test.resource.ResourceUtil;
import org.apache.tools.ant.Location;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FileList;
import org.apache.tools.ant.types.Path;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CayenneGeneratorTaskCrossMapRelationshipsTest {
/**
* Tests pairs generation with a cross-DataMap relationship.
*/
@Test
public void testCrossDataMapRelationships() throws Exception {
CayenneGeneratorTask task = new CayenneGeneratorTask();
task.setProject(new Project());
task.setTaskName("Test");
task.setLocation(Location.UNKNOWN_LOCATION);
// prepare destination directory
File destDir = new File(FileUtil.baseTestDirectory(), "cgen12");
// prepare destination directory
if (!destDir.exists()) {
assertTrue(destDir.mkdirs());
}
File map = new File(destDir, "cgen-dependent.map.xml");
ResourceUtil.copyResourceToFile("org/apache/cayenne/tools/cgen-dependent.map.xml", map);
File additionalMaps[] = new File[1];
additionalMaps[0] = new File(destDir, "cgen.map.xml");
ResourceUtil.copyResourceToFile("org/apache/cayenne/tools/cgen.map.xml", additionalMaps[0]);
FileList additionalMapsFilelist = new FileList();
additionalMapsFilelist.setDir(additionalMaps[0].getParentFile());
additionalMapsFilelist.setFiles(additionalMaps[0].getName());
Path additionalMapsPath = new Path(task.getProject());
additionalMapsPath.addFilelist(additionalMapsFilelist);
// setup task
task.setMap(map);
task.setAdditionalMaps(additionalMapsPath);
task.setMakepairs(true);
task.setOverwrite(false);
task.setMode("entity");
task.setIncludeEntities("MyArtGroup");
task.setDestDir(destDir);
task.setSuperpkg("org.apache.cayenne.testdo.cgen2.auto");
task.setUsepkgpath(true);
// run task
task.execute();
// check results
File a = new File(destDir, convertPath("org/apache/cayenne/testdo/cgen2/MyArtGroup.java"));
assertTrue(a.isFile());
assertContents(a, "MyArtGroup", "org.apache.cayenne.testdo.cgen2", "_MyArtGroup");
File _a = new File(destDir, convertPath("org/apache/cayenne/testdo/cgen2/auto/_MyArtGroup.java"));
assertTrue(_a.exists());
assertContents(_a, "_MyArtGroup", "org.apache.cayenne.testdo.cgen2.auto", "CayenneDataObject");
assertContents(_a, "import org.apache.cayenne.testdo.testmap.ArtGroup;");
assertContents(_a, " ArtGroup getToParentGroup()");
assertContents(_a, "setToParentGroup(ArtGroup toParentGroup)");
}
private String convertPath(String unixPath) {
return unixPath.replace('/', File.separatorChar);
}
private void assertContents(File f, String content) throws Exception {
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)));) {
String s = null;
while ((s = in.readLine()) != null) {
if (s.contains(content))
return;
}
fail("<" + content + "> not found in " + f.getAbsolutePath() + ".");
}
}
private void assertContents(File f, String className, String packageName, String extendsName) throws Exception {
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)));) {
assertPackage(in, packageName);
assertClass(in, className, extendsName);
}
}
private void assertPackage(BufferedReader in, String packageName) throws Exception {
String s = null;
while ((s = in.readLine()) != null) {
if (Pattern.matches("^package\\s+([^\\s;]+);", s)) {
assertTrue(s.contains(packageName));
return;
}
}
fail("No package declaration found.");
}
private void assertClass(BufferedReader in, String className, String extendsName) throws Exception {
Pattern classPattern = Pattern.compile("^public\\s+");
String s = null;
while ((s = in.readLine()) != null) {
if (classPattern.matcher(s).find()) {
assertTrue(s.contains(className));
assertTrue(s.contains(extendsName));
assertTrue(s.indexOf(className) < s.indexOf(extendsName));
return;
}
}
fail("No class declaration found.");
}
}